import is, { hasProperty } from '@form-create/utils/lib/type'
import { parseFn } from '@form-create/utils/lib/json'

export function makeRequiredRule() {
  return {
    type: 'Required', field: 'formCreate$required', title: '是否必填'
  }
}

export function makeOptionsRule(to, flag) {
  const options = [
    { 'label': 'JSON数据', 'value': 0 }
    // { 'label': '接口数据', 'value': 1 }
  ]

  const control = [
    {
      value: 0,
      rule: [
        {
          type: 'Struct',
          field: 'formCreate' + upper(to).replace('.', '>'),
          props: { defaultValue: [] }
        }
      ]
    },
    {
      value: 1,
      rule: [
        {
          type: 'Fetch',
          field: 'formCreateEffect>fetch',
          props: {
            to
          }
        }
      ]
    }
  ]

  if (flag !== false) {
    options.splice(0, 0, { 'label': '静态数据', 'value': 2 })
    control.push({
      value: 2,
      rule: [
        {
          type: 'TableOptions',
          field: 'formCreate' + upper(to).replace('.', '>'),
          props: { defaultValue: [] }
        }
      ]
    })
  }

  return {
    type: 'radio',
    title: '选项数据',
    field: '_optionType',
    value: flag !== false ? 2 : 0,
    options,
    props: {
      type: 'button'
    },
    control
  }
}

export function upper(str) {
  return str.replace(str[0], str[0].toLocaleUpperCase())
}

export const toJSON = function(val) {
  const type = /object ([a-zA-Z]*)/.exec(Object.prototype.toString.call(val))
  if (type && _toJSON[type[1].toLowerCase()]) {
    return _toJSON[type[1].toLowerCase()](val)
  } else {
    return val
  }
}

const _toJSON = {
  object: function(val) {
    var json = []
    for (var i in val) {
      if (!hasProperty(val, i)) continue
      json.push(
        toJSON(i) + ': ' +
                ((val[i] != null) ? toJSON(val[i]) : 'null')
      )
    }
    return '{\n ' + json.join(',\n ') + '\n}'
  },
  array: function(val) {
    for (var i = 0, json = [];i < val.length;i++) { json[i] = (val[i] != null) ? toJSON(val[i]) : 'null' }
    return '[' + json.join(', ') + ']'
  },
  string: function(val) {
    var tmp = val.split('')
    for (var i = 0;i < tmp.length;i++) {
      var c = tmp[i];
      (c >= ' ')
        ? (c === '\\') ? (tmp[i] = '\\\\')
          : (c === '"') ? (tmp[i] = '\\"') : 0
        : (tmp[i] =
                        (c === '\n') ? '\\n'
                          : (c === '\r') ? '\\r'
                            : (c === '\t') ? '\\t'
                              : (c === '\b') ? '\\b'
                                : (c === '\f') ? '\\f'
                                  : (c = c.charCodeAt(), ('\\u00' + ((c > 15) ? 1 : 0) + (c % 16)))
        )
    }
    return '"' + tmp.join('') + '"'
  }
}

export const deepParseFn = function(target) {
  for (const key in target) {
    if (Object.prototype.hasOwnProperty.call(target, key)) {
      const data = target[key]
      if (Array.isArray(data) || is.Object(data)) {
        deepParseFn(data)
      }
      if (is.String(data)) {
        target[key] = parseFn(data)
      }
    }
  }
  return target
}
